#ifndef MAIN_H
#define MAIN_H

typedef unsigned long long uint64_t;
typedef unsigned long uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;
typedef	unsigned int uintptr_t;
typedef unsigned long long * uint64ptr_t;
typedef unsigned long size_t;
typedef unsigned int handle_t;
typedef unsigned char BOOL;
typedef unsigned int pid_t;
typedef unsigned int elf_t;

// Namen und Beschreibungen aus der ELF Spezifikation
typedef unsigned long Elf32_Addr;	// Programmadresse
typedef unsigned short Elf32_Half;	// Mittelgroßer Integer
typedef unsigned long Elf32_Off;	// Datei offset
typedef long Elf32_Sword;		// Großer Integer
typedef unsigned long Elf32_Word;	// Großer Integer

typedef __builtin_va_list va_list;

// Farben definieren
#define COLOR_DARKBLUE 0x1
#define COLOR_GREEN 0x2
#define COLOR_LIGHTBLUE 0x3
#define COLOR_RED 0x4
#define COLOR_PURPLE 0x5
#define COLOR_BROWN 0x6
#define COLOR_LIGHTGREY 0x7
#define COLOR_GREY 0x8
#define COLOR_BLUE 0x9

// Andere defines
#define TRUE 0x01
#define FALSE 0x0
#define NULL (void*)0

// va_list
#define va_start(ap, X) __builtin_va_start(ap, X)
#define va_arg(ap, type) __builtin_va_arg(ap, type)
#define va_end(ap) __builtin_va_end(ap)

// Ext2 Defines

#define EXT2_SUPER_MAGIC 0xEF53
#define EXT2_VALID_FS 1

#define EXT2_ERROR_FS 2
#define EXT2_ERRORS_CONTINUE 1
#define EXT2_ERRORS_RO 2
#define EXT2_ERRORS_PANIC 3

// iNode i_flags
#define EXT2_SECRM_FL 0x00000001	// Sicheres Löschen. Die Blöcke der Datei werden beim Löschen mit Müll überschrieben
#define EXT2_UNRM_FL 0x00000002		// Beim Löschen wird der iNode in eine Art Papierkorb geschoben
#define EXT2_COMPR_FL 0x00000004	// Die Datei ist komprimiert
#define EXT2_SYNC_FL 0x00000008		// Die Daten der Datei im RAM werden sofort mit denen auf der Platte synchronisiert
#define EXT2_IMMUTABLE_FL 0x00000010	// Nicht verschiebbare Datei
#define EXT2_APPEND_FL 0x00000020	// Es ist nur Hinzufügender Zugriff auf die Datei erlaubt (Append)
#define EXT2_NODUMP_FL 0x00000040	// Nicht löschbar, auch wenn i_links_count = 0 ist
#define EXT2_NOATIME_FL 0x00000080	// Beim Zugriff auf die Datei wird i_atime nicht aktualisiert 

#define EXT2_DIRTY_FL 0x00000100	// Dreckig (???)
#define EXT2_COMPRBLK_FL 0x00000200	// Die Datei ist komprimiert
#define EXT2_NOCOMPR_FL 0x00000400	// Komprimierte Daten nicht dekomprimieren
#define EXT2_ECOMPR_FL 0x00000800	// Wird gesetzt, wenn ein Fehler während des entpackens auftritt

#define EXT2_BTREE_FL 0x00010000	// B-Baum Verzeichniss
#define EXT2_INDEX_FL 0x00010000	// Wenn dieses Flag gesetzt ist ist die Verzeichniss Datei Hash Indexiert
#define EXT2_IMAGIC_FL 0x00020000	// ???
#define EXT3_JOURNAL_DATA_FL 0x00040000	// Journalingdatei
#define EXT2_RESERVED_FL 0x80000000	// Reserviert

// Ordner iNode Flags
#define EXT2_FT_UNKNOWN 0	// Unbekannter Dateityp
#define EXT2_FT_REG_FILE 1	// Normale Datei
#define EXT2_FT_DIR 2		// Verzeichniss Datei
#define EXT2_FT_CHRDEV 3	// Zeichenorientiertes Gerät
#define EXT2_FT_BLKDEV 4	// Block Gerät
#define EXT2_FT_FIFO 5		// Puffer Datei
#define EXT2_FT_SOCK 6		// Socket Datei
#define EXT2_FT_SYMLINK 7	// Symbolischer Link

// Reservierte iNodes
#define EXT2_BAD_INO 1		// Dieser iNode enthält beschädigte Blöcke
#define EXT2_ROOT_INO 2		// Root Verzeichniss iNode
#define EXT2_ACL_IDX_INO 3	// ACL Index iNode (Veraltet?)
#define EXT2_ACL_DATA_INO 4	// ACL Daten iNode (Veraltet?)
#define EXT2_BOOT_LOADER_INO 5	// Boot Loader iNode
#define EXT2_UNDEL_DIR_INO 6	// Unbenutzt

// iNode Datei Formate
#define EXT2_S_IFSOCK	0xC000	// Socket
#define EXT2_S_IFLNK	0xA000	// Symbolischer Link
#define EXT2_S_IFREG	0x8000	// Normale Datei
#define EXT2_S_IFBLK	0x6000	// Blockgerät
#define EXT2_S_IFDIR	0x4000	// Verzeichniss
#define EXT2_S_IFCHR	0x2000	// Zeichenorientiertes Gerät
#define EXT2_S_IFIFO	0x1000	// FIFO
// Zugriffsrechte
#define EXT2_S_IRUSR	0x0100	// Besitzer lesen
#define EXT2_S_IWUSR	0x0080	// Besitzer schreiben
#define EXT2_S_IXUSR	0x0040	// Besitzer ausführen
#define EXT2_S_IRGRP	0x0020	// Gruppe lesen
#define EXT2_S_IWGRP	0x0010	// Gruppe schreiben
#define EXT2_S_IXGRP	0x0008	// Gruppe ausführen
#define EXT2_S_IROTH	0x0004	// Andere lesen
#define EXT2_S_IWOTH	0x0002	// Andere schreiben
#define EXT2_S_IXOTH	0x0001	// Andere ausführen
#define EXT2_S_ISUID	0x0800	// Set process User ID (???)
#define EXT2_S_ISGID	0x0400	// Set process Group ID (???)
#define EXT2_S_ISVTX	0x0200	// sticky bit (???)

// FS Versionen
#define EXT2_GOOD_OLD_REV 0 // FS Revision 0
#define EXT2_DYNAMIC_REV 1  // FS Revision 1

#include "memory.h"

char *int2str (int, int);
char *uint2str (uint64_t, int);
char *int2str_intern (uint64_t, int, BOOL);
inline unsigned int power (unsigned int zahl, int exponent);

#endif
